package com.jxt.myjxtmanager.adapter;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Build;
import android.text.util.Linkify;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.TextView;

import com.jxt.myjxtmanager.utils.imageloader.ImageLoaderAbs;

/**
 * 封装了常用View的赋值，以及事件监听的方法，方便操作. 并且赋值方法都有采用链式编程，更加方便书写.
 * 相当于传统adapter实现中的ViewHold模式
 * 
 * @author lkk
 * 
 */
public class BaseAdapterHelper {
	/**
	 * 根据视图资源Id进行缓存的视图集合
	 */
	private final SparseArray<View> mViews;
	/**
	 * 上下文对象
	 */
	private final Context mContext;
	/**
	 * 列表项在数据集合中的索引位置
	 */
	private int mPosition;
	/**
	 * 可复用的列表项布局
	 */
	private View mConvertView;
	/**
	 * 列表项布局资源Id
	 */
	private int mLayoutId;

	protected BaseAdapterHelper(Context context, ViewGroup parent,
			int layoutId, int position) {
		this.mContext = context;
		this.mPosition = position;
		this.mLayoutId = layoutId;
		this.mViews = new SparseArray<View>();
		mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
				false);
		mConvertView.setTag(this);
	}
	/**
	 * 获得BaseAdapterHelper对象,这是唯一的一个入口方法
	 * 
	 * @param context
	 *            上下文
	 * @param convertView
	 *            BaseAapater的getView方法的convertView参数
	 * @param parent
	 *            BaseAapater的getView方法的parent参数
	 * @param layoutId
	 *            列表项布局资源Id
	 * @param position
	 *            BaseAapater的getView方法的position参数
	 * @return 返回BaseAdapterHelper的一个实例
	 */
	public static BaseAdapterHelper get(Context context, View convertView,
			ViewGroup parent, int layoutId, int position) {
		if (convertView == null) {
			return new BaseAdapterHelper(context, parent, layoutId, position);
		}

		// 获得一个可复用对象,并更新它的位置
		BaseAdapterHelper existingHelper = (BaseAdapterHelper) convertView
				.getTag();

		if (existingHelper.mLayoutId != layoutId) {
			return new BaseAdapterHelper(context, parent, layoutId, position);
		}

		existingHelper.mPosition = position;
		return existingHelper;
	}
	/**
	 * 根据视图资源Id获取视图对象
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @return 返回该视图资源Id对应的视图
	 */
	public <T extends View> T getView(int viewId) {
		return retrieveView(viewId);
	}

	@SuppressWarnings("unchecked")
	protected <T extends View> T retrieveView(int viewId) {
		View view = mViews.get(viewId);
		if (view == null) {
			view = mConvertView.findViewById(viewId);
			mViews.put(viewId, view);
		}
		return (T) view;
	}
	/**
	 * 设置文本视图的显示文本
	 * 
	 * @param viewId
	 *            文本视图资源Id
	 * @param value
	 *            要显示的文本
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setText(int viewId, String value) {
		TextView view = retrieveView(viewId);
		view.setText(value);
		return this;
	}
	/**
	 * 设置图片视图显示的图片资源
	 * 
	 * @param viewId
	 *            图片视图资源Id
	 * @param imageResId
	 *            图片资源Id
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setImageResource(int viewId, int imageResId) {
		ImageView view = retrieveView(viewId);
		view.setImageResource(imageResId);
		return this;
	}
	/**
	 * 设置视图的背景颜色
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param color
	 *            颜色值
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setBackgroundColor(int viewId, int color) {
		View view = retrieveView(viewId);
		view.setBackgroundColor(color);
		return this;
	}
	/**
	 * 设置视图的背景
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param backgroundRes
	 *            背景资源
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setBackgroundRes(int viewId, int backgroundRes) {
		View view = retrieveView(viewId);
		view.setBackgroundResource(backgroundRes);
		return this;
	}
	/**
	 * 设置文本视图的前景色
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param textColor
	 *            文本前景色
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setTextColor(int viewId, int textColor) {
		TextView view = retrieveView(viewId);
		view.setTextColor(textColor);
		return this;
	}
	/**
	 * 设置文本视图的前景色
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param textColorRes
	 *            前景色资源
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setTextColorRes(int viewId, int textColorRes) {
		TextView view = retrieveView(viewId);
		view.setTextColor(mContext.getResources().getColor(textColorRes));
		return this;
	}
	/**
	 * 设置图片视图显示的图片
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param imageUrl
	 *            图片网络地址
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setImageUrl(int viewId, String imageUrl) {
		ImageLoaderAbs.getInstance().displayImage(imageUrl, (ImageView) retrieveView(viewId));
		return this;
	}
	/**
	 * 设置图片视图显示的图片(圆角)
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param imageUrl
	 *            图片网络地址
	 * @param subRes
	 *            默认加载图片
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setRoundImageUrl(int round, int viewId, String imageUrl, int subRes) {
		ImageLoaderAbs.getInstance().roundDisplayImage(imageUrl, (ImageView) retrieveView(viewId), subRes);
//		ImageLoaderAbs.getInstance().roundDisplayImage(round, imageUrl, (ImageView) retrieveView(viewId), subRes);
		return this;
	}
	/**
	 * 设置视图的透明度,可多次调用
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param value
	 *            透明度的值
	 * @return 返回当前对象
	 */
	@SuppressLint("NewApi")
	public BaseAdapterHelper setAlpha(int viewId, float value) {
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
			retrieveView(viewId).setAlpha(value);
		} else {
			// 3.0之前版本使用动画资源来改变透明度
			AlphaAnimation alpha = new AlphaAnimation(value, value);
			alpha.setDuration(0);
			alpha.setFillAfter(true);
			retrieveView(viewId).startAnimation(alpha);
		}
		return this;
	}
	/**
	 * 设置视图的可见性
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param visible
	 *            true可见,false不可见
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setVisible(int viewId, boolean visible) {
		View view = retrieveView(viewId);
		view.setVisibility(visible ? View.VISIBLE : View.GONE);
		return this;
	}
	/**
	 * 设置文本视图超链接
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper linkify(int viewId) {
		TextView view = retrieveView(viewId);
		Linkify.addLinks(view, Linkify.ALL);
		return this;
	}
	/**
	 * 设置视图选中状态
	 * @param viewId   视图资源Id
	 * @param checked 是否选中
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setChecked(int viewId, boolean checked)
	{
		Checkable view = (Checkable) retrieveView(viewId);
		view.setChecked(checked);
		return this;
	}
	/**
	 * 设置文本视图的字体
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param typeface
	 *            字体
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setTypeface(int viewId, Typeface typeface) {
		TextView view = retrieveView(viewId);
		view.setTypeface(typeface);
		view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
		return this;
	}
	/**
	 * 设置多个文本视图的字体
	 * 
	 * @param typeface
	 *            字体
	 * @param viewIds
	 *            多个视图资源Id
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setTypeface(Typeface typeface, int... viewIds) {
		for (int viewId : viewIds) {
			TextView view = retrieveView(viewId);
			view.setTypeface(typeface);
			view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
		}
		return this;
	}
	/**
	 * 设置视图的相关tag
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param tag
	 *            tag对象
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setTag(int viewId, Object tag) {
		View view = retrieveView(viewId);
		view.setTag(tag);
		return this;
	}
	/**
	 * 设置视图的相关tag
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param key
	 *            tag对应的key
	 * @param tag
	 *            tag对象
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setTag(int viewId, int key, Object tag) {
		View view = retrieveView(viewId);
		view.setTag(key, tag);
		return this;
	}
	/**
	 * 设置视图的选中状态
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param selected
	 *            是否选中
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setSelected(int viewId, boolean selected) {
		View view = retrieveView(viewId);
		view.setSelected(selected);
		return this;
	}
	/**
	 * 设置视图点击事件监听器
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param listener
	 *            事件监听器
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setOnClickListener(int viewId,
			View.OnClickListener listener) {
		View view = retrieveView(viewId);
		view.setOnClickListener(listener);
		return this;
	}
	/**
	 * 设置视图触摸事件监听器
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param listener
	 *            事件监听器
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setOnTouchListener(int viewId,
			View.OnTouchListener listener) {
		View view = retrieveView(viewId);
		view.setOnTouchListener(listener);
		return this;
	}
	/**
	 * 设置视图长按事件监听器
	 * 
	 * @param viewId
	 *            视图资源Id
	 * @param listener
	 *            事件监听器
	 * @return 返回当前对象
	 */
	public BaseAdapterHelper setOnLongClickListener(int viewId,
			View.OnLongClickListener listener) {
		View view = retrieveView(viewId);
		view.setOnLongClickListener(listener);
		return this;
	}
	/**
	 * 获取当前视图
	 * 
	 * @return 返回convertView
	 */
	public View getView() {
		return mConvertView;
	}
	/**
	 * 获取列表项在数据集合中的索引位置
	 */
	public int getPosition() {
		return mPosition;
	}
}
